/* 
 * UsuarioDAO.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.entity.Usuario;

/**
 * DAO de acesso a dados da tabela Usuario.
 *
 * @author Ludemeula Fernandes de Sá
 */
public class UsuarioDAO extends GenericChamatecDAO<Usuario> {
	private static final long serialVersionUID = 5343913677644702840L;

	/**
	 * Lista os dados da tabela Usuario pela descrição.
	 * 
	 * @return
	 * @throws ChamatecNegocioException
	 */
	public List<Usuario> getListDescricao() throws ChamatecNegocioException {
		List<Usuario> retorno = null;

		try { 
			CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Usuario> criteria = builder.createQuery(Usuario.class);
			Root<Usuario> root = criteria.from(Usuario.class);
			criteria.multiselect(root.get("id"), root.get("nome"), root.get("cpf")).orderBy(builder.asc(root.get("nome")));
			retorno = getEntityManager().createQuery(criteria).getResultList();
		} catch (Exception e) {
			throw new ChamatecNegocioException(e);
		}

		return retorno;
	}

	/**
	 * Pesquisa os dados da tabela Usuario.
	 * 
	 * @param usuario
	 * @return
	 * @throws ChamatecNegocioException
	 */
	public List<Usuario> pesquisar(Usuario usuario) throws ChamatecNegocioException {
		List<Usuario> retorno = null;
		try {
			CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Usuario> criteriaQuery = criteriaBuilder.createQuery(Usuario.class);
			Root<Usuario> root = criteriaQuery.from(Usuario.class);
			List<Predicate> condicoes = new ArrayList<Predicate>();

			if (usuario != null) {
				if (usuario.getNome() != null && !usuario.getNome().equals("")) {
					Predicate whereNome = criteriaBuilder.like(root.<String> get("nome"), "%" + usuario.getNome() + "%");
					condicoes.add(whereNome);
				}

				if (usuario.getLogin() != null && !usuario.getLogin().equals("")) {
					Predicate whereLogin = criteriaBuilder.like(root.<String> get("login"), "%" + usuario.getLogin() + "%");
					condicoes.add(whereLogin);
				}

				if (usuario.getPerfil() != null && usuario.getPerfil().getId() != null && usuario.getPerfil().getId() != 0) {
					Predicate wherePerfil = criteriaBuilder.equal(root.get("perfil"), usuario.getPerfil());
					condicoes.add(wherePerfil);
				}
			}

			Predicate whereExcluido = criteriaBuilder.notEqual(root.get("isExcluido"), true);
			condicoes.add(whereExcluido);
			root.fetch("perfil");
			criteriaQuery.where(condicoes.toArray(new Predicate[] {}));
			criteriaQuery.select(root).orderBy(criteriaBuilder.asc(root.get("nome")));
			retorno = getEntityManager().createQuery(criteriaQuery).getResultList();
		} catch (Exception e) {
			throw new ChamatecNegocioException(e);
		}
		return retorno;
	}

	/**
	 * Recupera Usuario pelo CPF e Login.
	 * 
	 * @param usuario
	 * @return
	 * @throws ChamatecNegocioException
	 */
	public Usuario recuperarPorCpf(Usuario usuario) throws ChamatecNegocioException {
		Usuario retorno = null;
		try {
			CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Usuario> criteriaQuery = criteriaBuilder.createQuery(Usuario.class);
			Root<Usuario> root = criteriaQuery.from(Usuario.class);
			List<Predicate> condicoes = new ArrayList<Predicate>();

			Predicate whereCpf = criteriaBuilder.equal(root.<String>get("cpf"), usuario.getCpf());
			condicoes.add(whereCpf);

			Predicate whereExcluido = criteriaBuilder.notEqual(root.get("isExcluido"), true);
			condicoes.add(whereExcluido);

			criteriaQuery.where(condicoes.toArray(new Predicate[]{}));

			criteriaQuery.select(root).orderBy(criteriaBuilder.asc(root.get("id")));
			List<Usuario> lista = getEntityManager().createQuery(criteriaQuery).getResultList();
			if (lista != null && lista.size() > 0) {
				retorno = lista.get(0);
			}
		} catch (Exception e) {
			throw new ChamatecNegocioException(e);
		}
		return retorno;
	}

	/**
	 * Recupera os dados do usuário pelo login.
	 * 
	 * @param usuario
	 * @return
	 * @throws ChamatecNegocioException
	 */
	public Usuario recuperarPorLogin(Usuario usuario) throws ChamatecNegocioException {
		Usuario retorno = null;
		try {
			CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Usuario> criteriaQuery = criteriaBuilder.createQuery(Usuario.class);
			Root<Usuario> root = criteriaQuery.from(Usuario.class);
			List<Predicate> condicoes = new ArrayList<Predicate>();

			Predicate whereLogin = criteriaBuilder.equal(root.<String>get("login"), usuario.getLogin());
			condicoes.add(whereLogin);

			Predicate whereExcluido = criteriaBuilder.notEqual(root.get("isExcluido"), true);
			condicoes.add(whereExcluido);

			criteriaQuery.where(condicoes.toArray(new Predicate[]{}));

			criteriaQuery.select(root).orderBy(criteriaBuilder.asc(root.get("id")));
			List<Usuario> lista = getEntityManager().createQuery(criteriaQuery).getResultList();
			if (lista != null && lista.size() > 0) {
				retorno = lista.get(0);
			}
		} catch (Exception e) {
			throw new ChamatecNegocioException(e);
		}
		return retorno;
	}

	/**
	 * Recupera Usuario pelo login trazendo o perfil do usuário.
	 * 
	 * @param usuario
	 * @return
	 * @throws ChamatecNegocioException
	 */
	public Usuario recuperarPorCpfComPerfil(Usuario usuario) throws ChamatecNegocioException {
		Usuario retorno = null;
		try {
			CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Usuario> criteriaQuery = criteriaBuilder.createQuery(Usuario.class);
			Root<Usuario> root = criteriaQuery.from(Usuario.class);
			List<Predicate> condicoes = new ArrayList<Predicate>();

			Predicate whereLogin = criteriaBuilder.like(root.<String>get("login"), usuario.getLogin());
			condicoes.add(whereLogin);
			Predicate whereExcluido = criteriaBuilder.notEqual(root.get("isExcluido"), true);
			condicoes.add(whereExcluido);

			criteriaQuery.where(condicoes.toArray(new Predicate[]{}));

			root.fetch("perfil");
			criteriaQuery.select(root).orderBy(criteriaBuilder.asc(root.get("id")));
			List<Usuario> lista = getEntityManager().createQuery(criteriaQuery).getResultList();
			if (lista != null && lista.size() > 0) {
				retorno = lista.get(0);
			}
		} catch (Exception e) {
			throw new ChamatecNegocioException(e);
		}
		return retorno;
	}

	/**
	 * Recupera os dados do usuário pelo nome.
	 * 
	 * @param usuario
	 * @return
	 * @throws ChamatecNegocioException
	 */
	public Usuario recuperarPorNome(Usuario usuario) throws ChamatecNegocioException {
		Usuario retorno = null;
		try {
			CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Usuario> criteriaQuery = criteriaBuilder.createQuery(Usuario.class);
			Root<Usuario> root = criteriaQuery.from(Usuario.class);
			criteriaQuery.where(criteriaBuilder.equal(root.get("nome"), usuario.getNome()));
			criteriaQuery.select(root).orderBy(criteriaBuilder.asc(root.get("nome")));
			List<Usuario> lista = getEntityManager().createQuery(criteriaQuery).getResultList();
			if (lista != null && lista.size() > 0) {
				retorno = lista.get(0);
			}
		} catch (Exception e) {
			throw new ChamatecNegocioException(e);
		}
		return retorno;
	}
}